How to "Iredi CrackMe v.1.0.0" by Alchemiko

CrackMe jest bardzo przyjemne, tak dla rozrywki, ci ktrzy je amali, to wiedz, dlaczego :-). W sumie, dobrze, e jeszcze kto stworzy co takiego, eby poruszy beginnersk crack scen ;-). CrackMe jest bardzo dobre na pierwsza lekcj Crackingu, ale w sieci jest duo tutorw o Crackingu [edito: wystarczy poszuka].

Wic zabieramy si za nasz programik:

4,00 KB (4096b)
Nie pakowany (bo za may :-))
Pogryziemy go w Win32dasm. Nie pamitam, czy by tutor jak w Win32dasm zrobi KeyGena. :-)

Odpalamy progra, NAAG z informacj co mamy znale:

- Name
- Serial

Okienko proga ciekawe, nie powiem, da si widzie napis Unregistered,
co moe nas zmyli, czy przypadkiem KeyFile / RegFile nie ma, no w najgorszym przypadku Dongle ;]

Wic swoje dane, ja wpisaem:

Alchemiko
1234567

W sumie jest to niepotrzebne, ale jako mi to z SI zostao :-)
Wida, e nie ma adnego infa o bad, czyli w SI moemy apa na GetDlgItemTextA (ale my w win32dasm)

Wic adujemy CM do proga, powinno si szybciutko zaadowa
Patrzymy na SDR, ooo... jest: "Cracked :-)" no to dajemy w to miejsce i widzimy taki oto kod:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401033(C)

:0040108D 663D1101          cmp ax, 0111
:00401091 7564              jne 004010F7
:00401093 837D1004          cmp dword ptr [ebp+10], 00000004
:00401097 755A              jne 004010F3
:00401099 6A04              push 00000004
:0040109B 6854304000        push 00403054
:004010A0 6A05              push 00000005
:004010A2 FF7508            push [ebp+08]

* Reference To: user32.GetDlgItemTextA, Ord:00F4h

:004010A5 E870000000        Call 0040111A ; Pobieranie Name
:004010AA 50                push eax
:004010AB 85C0              test eax,eax  ; Sprawdzanie, czy co wpisane
:004010AD 7459              je 00401108   ; Jeli nie, to nie
:004010AF 6A04              push 00000004
:004010B1 6858304000        push 00403058
:004010B6 6A06              push 00000006
:004010B8 FF7508            push [ebp+08]

* Reference To: user32.GetDlgItemTextA, Ord:00F4h

:004010BB E85A000000        Call 0040111A ; Pobieranie Key'a
:004010C0 50                push eax
:004010C1 85C0              test eax, eax ; Sprawdzanie, czy co wpisane
:004010C3 7443              je 00401108   ;Jeli nie, to nie
:004010C5 8B0D54304000      mov ecx, dword ptr [00403054] ; Name do ecx
:004010CB 81F134120000      xor ecx, 00001234  ; Name xor z 00001234h
:004010D1 8B1558304000      mov edx, dword ptr [00403058] ; Tu adowany
                                                          ; jest Key
:004010D7 3BCA                    cmp ecx, edx  ; czy Key = ^Name
:004010D9 752D                    jne 00401108  ; Jeli nie, to nie
:004010DB 6A00                    push 00000000 ; Dalej, to ju wida :-)

* Possible StringData Ref from Data Obj ->"CrackMe v.1.0.0 by Iredi"
                                  |
:004010DD 6800304000              push 00403000

* Possible StringData Ref from Data Obj ->"Cracked :-)"
                                  |
:004010E2 6819304000              push 00403019
:004010E7 6A00                    push 00000000

* Reference To: user32.MessageBoxA, Ord:019Dh
                                  |
:004010E9 E838000000              Call 00401126

* Reference To: kernel32.ExitProcess, Ord:0080h
                                  |
:004010EE E845000000              Call 00401138

Czyli jak widzimy zabezpieczenie "niby" jest :-). Szkoda by byo taki adny program Patchowa, Name/Key atwo si wycignie, my sobie KeyGena napiszemy :-)

Ja wydaem 2 KeyGeny:

- 1 Takie jak my CrackMe
- 2 Na potrzeby tego Tutora

Na samym dole macie cay KeyGen, of coz w Asm32 :-)

Jedyn rzecz jak musimy zrobi:

        mov     ecx, dword ptr [szName]
        xor     ecx, 1234h
        mov     edx, dword ptr [szKey]
        cmp     ecx, edx
        jnz     _bad
        ;Good :-)

W sumie, to nawet nie trzeba Algo odwraca:

        mov     ecx, dword ptr [szName]         ;do ecx nasz Name
        xor     ecx, 1234h                      ;Xor'owanie
        mov     dword ptr [szPublic], ecx       ;No i do szPublic nasz key

Tak wic, teraz tylko zrobi pobieranie textu, adowanie i wstawi to do naszego templata Kigena. A caa procedura Kigenica wyglda nastpujco:

        invoke  GetDlgItemText,hWnd,IDC_EDIT01,ADDR szName,4
        push    eax
        test    eax,eax
        je      _brak_danych

        mov     ecx, dword ptr [szName]
        xor     ecx, 1234h
        mov     dword ptr [szPublic], ecx

        push    offset szPublic
        push    IDC_EDIT02
        push    hWnd
        call    SetDlgItemTextA

        ret

I to wszystko, prawda, e przyjemne. A teraz wg. obietnicy Wszystkie src do KeyGena.

-- KeyGen.asm --->
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

_DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const
        IDD_DIALOG1     equ 10
        IDC_CHECK       equ 20
        IDI_ICON        equ 30
        IDC_EDIT01      equ 110
        IDC_EDIT02      equ 101
        IDC_EXIT        equ 103

.data
szNoCapt        db 'Alchemiko',0
szNoText        db 'Bad Info',0

.data?
szName          db 4 dup(?)
szPublic        db 4 dup(?)

hInstance       HINSTANCE ?

.code

start:
     invoke  GetModuleHandleA, 0
     mov     hInstance,eax
     invoke  DialogBoxParamA, hInstance, IDD_DIALOG1,0,offset _DlgProc,0
     invoke  ExitProcess,eax


_exit:
     call    ExitProcess
     ret

_DlgProc proc hWnd:DWORD, wmsg:DWORD, _wparam:DWORD, _lparam:DWORD

     movzx eax,word ptr [wmsg]

     cmp     ax,WM_INITDIALOG
     je      _initdlg

     cmp     ax,WM_CLOSE
     je      _exit

     cmp     ax,WM_COMMAND
     je      _wmcommand

     sub     eax,eax
     ret

_initdlg:
     invoke  GetDlgItem, hWnd,IDC_CHECK
     push    eax
     invoke  LoadIconA,hInstance,IDI_ICON
     pop     ebx
     invoke  SendMessageA,ebx,BM_SETIMAGE,1,eax
     invoke  SendMessageA,hWnd,WM_SETICON,0,eax
     invoke  SetFocus,eax

_wmcommand:
     cmp     word ptr[_wparam],IDC_CHECK
     je      _check
     ret

_check:
     invoke  GetDlgItemText,hWnd,IDC_EDIT01,ADDR szName,4
     push    eax
     test    eax,eax
     je      _brak_danych

     mov     ecx, dword ptr [szName]
     xor     ecx, 1234h
     mov     dword ptr [szPublic], ecx

     push    offset szPublic
     push    IDC_EDIT02
     push    hWnd
     call    SetDlgItemTextA

     ret

_brak_danych:
     push    0
     push    offset szNoCapt
     push    offset szNoText
     push    0
     call    MessageBoxA
     ret

_DlgProc endp
end start
-- KeyGen.asm --->

-- KeyGen.bat --->
\masm32\bin\cvtres /machine:ix86   rsrc.res
\masm32\bin\ml /coff /c /Cp /Gz KeyGen.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS  KeyGen.obj rsrc.obj
-- KeyGen.bat --->

-- rsrc.rc --->
10 DIALOGEX 150, 100, 187, 44
STYLE DS_ABSALIGN | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND
      | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Alchemiko kigen for Iredi Cm v.1.0.0"
FONT 8, "MS Sans Serif"
{
    CONTROL "", 110, EDIT, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER
            | WS_TABSTOP, 27, 10, 104, 14 
    CONTROL "KeyGen", 20, BUTTON, BS_DEFPUSHBUTTON | BS_FLAT | WS_CHILD
            | WS_VISIBLE | WS_TABSTOP, 133, 10, 50, 29 , 0x00000080
    CONTROL "", 101, EDIT, ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE
            | WS_BORDER | WS_TABSTOP, 27, 25, 104, 14 
    CONTROL "Name:", 0, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE
            | WS_GROUP, 6, 13, 19, 8 
    CONTROL "Key:", 1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE
            | WS_GROUP, 6, 28, 15, 9 
    CONTROL "  KeyGen  ", -1, BUTTON, BS_GROUPBOX | BS_CENTER | WS_CHILD
            | WS_VISIBLE, 3, 0, 182, 42 
}

30 ICON "Icon.ico"
-- rsrc.rc --->

Eh. no to tyle tego dobrego ;-)

Pozdro

Alchemiko
alchemiko@poczta.onet.pl
http://alchemiko.prv.pl